﻿using System.Linq;
using compshop.Infrastructure;
using compshop.Infrastructure.CompShopDataService;
using System.Collections.Generic;
using compshop.Modules.ClientOrderEdit.Views;
using System.Windows;

namespace compshop.Modules.ClientOrderEdit.Presenter
{
    public class ClientOrderEditPresenter
    {
        private CompShopEntities contextDS;
        private EventsManager eventsManager;

        public IViewClientOrderEdit View { set; get; }
        public ClientOrder ClientOrder { set; get; }
        public decimal Total { set; get; }

        public ClientOrderEditPresenter(EventsManager eventsManager)
        {
            contextDS = CompShopEntitiesContext.GetInstance();
            this.eventsManager = eventsManager;
            eventsManager.clientOrderEditPresenter = this;
            ClientOrder = GetClientOrder(1);
            eventsManager.Subscribe();
        }

        public ClientOrder GetClientOrder(int id)
        {
            ClientOrder order = contextDS.ClientOrders.Where(x => x.ClientOrderID == id).FirstOrDefault();
            order.Products.Load(contextDS.Products.Expand("GeneralProduct").Where(x => x.ClientOrderID == order.ClientOrderID));
            contextDS.LoadProperty(order, "Employee");
            Total = 0;
            foreach (Product p in order.Products)
            {
                contextDS.LoadProperty(p.GeneralProduct, "SubCategory");
                contextDS.LoadProperty(p.GeneralProduct, "Producer");
                Total =(decimal)(Total+ p.GeneralProduct.CurrentPrice);
            }
            contextDS.LoadProperty(order, "Department");
            return order;
        }

        public void RemoveGoods(IList<Product> products)
        {
            if (products.Count != 0)
            {
                YesNoDialog dialog = new YesNoDialog(Resource.msgIsSureInDeletingGoods);
                if (dialog.ShowDialog() == true)
                {
                    //удаление товаров, снятие резерва, аннуляция связанных с ними заявок на доставку
                }
            }
        }

        public void ReplaceGoods(IList<Product> products)
        {
            if (products.Count != 0)
            {
                YesNoDialog dialog = new YesNoDialog(Resource.msgIsSureInReplacingGoods);
                if (dialog.ShowDialog() == true)
                {
                    //создание нового заказа с такой же шапкой и перемещаются в него выбранные товары, открывается созданный заказ
                }
            }
        }

        public void ConfirmDelivery()
        { 
        // для всех товаров, для которых есть заявки на доставку со статусом 2 поставить 3
           // заказу ставится статус 3
        }

        public void ShowCheckDialog()
        {
            CheckDialog dialog = new CheckDialog();
            if (dialog.ShowDialog()==true)
            { 
            //установиь статус 6, поставить дату продажи и менеджера, поставить всем товарам дату продажи и статус 3
                View.UpdateData();
            }
        }

        #region Publishers
        public void onSelectedClientOrder(int id)
        {
            eventsManager.EventAggregator.GetEvent<ClientOrderSelectedEvent>().Publish(id);
        }
        #endregion

        #region Handlers

        public void SetSelectedClientOrder(int id)
        {
            if (id != ClientOrder.ClientOrderID)
            {
                ClientOrder = GetClientOrder(id);
                View.UpdateData();
            }
        }

        public void AddProductToOrder(int id)
        {
            Product prod = contextDS.Products.Expand("GeneralProduct").
                Where(x => x.ProductID == id).FirstOrDefault();
            contextDS.LoadProperty(prod, "GeneralProduct");

            if (prod != null)
            {
                if (CompShopEntitiesContext.AddProductToOrder(ClientOrder.ClientOrderID, prod.ProductID, 1) < 0)
                {
                    MessageBox.Show(Resource.ErrorSaveChanges);
                }
                else
                {
                    contextDS.LoadProperty(prod.GeneralProduct, "SubCategory");
                    contextDS.LoadProperty(prod.GeneralProduct, "Producer");
                    Total += (decimal)prod.GeneralProduct.CurrentPrice;
                    ClientOrder.Products.Add(prod);
                    View.UpdateData();
                }
            }
            else
            {

            }
        }

        #endregion

    }
}
